home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / music / resound.arc / RESOUND.ARC / RESOUND.S < prev   
Text File  |  1989-03-08  |  16KB  |  460 lines

  1. * PLAY DIGITIZED SOUND FILE WHEN TERMINATING PROGRAM
  2.  
  3.           move.l 4(a7),a0          calculate program size
  4.           move.l #$100,d6
  5.           add.l 12(a0),d6
  6.           add.l 20(a0),d6
  7.           add.l 28(a0),d6
  8.  
  9.           clr.l -(a7)              enter supervisor mode
  10.           move.w #$20,-(a7)
  11.           trap #1
  12.           addq.l #6,a7
  13.           move.l d0,d4             save ssp
  14.  
  15.           pea dta(PC)              set DTA
  16.           move.w #$1A,-(a7)
  17.           trap #1
  18.           addq.l #6,a7
  19.  
  20.           move.w #0,-(a7)          look for RESOUND.INF
  21.           pea inf_file(PC)
  22.           move.w #$4E,-(a7)
  23.           trap #1
  24.           add.l #8,a7
  25.           lea no_inf(PC),a1
  26.           tst d0
  27.           bne problem
  28.  
  29.           lea dta(PC),a6
  30.           move.l 26(a6),d7         get RESOUND.INF file length
  31.           sub.l #1,d7
  32.           andi.l #$F,d7
  33.  
  34.           clr.w -(a7)              open RESOUND.INF
  35.           pea inf_file(PC)
  36.           move.w #$3D,-(a7)
  37.           trap #1
  38.           add.l #8,a7
  39.           lea open(PC),a1
  40.           tst.l d0
  41.           bmi problem
  42.           move.w d0,d5             save file handle
  43.  
  44.           pea freq_ind(PC)         pointer to buffer
  45.           move.l d7,-(a7)          number of bytes to read
  46.           move.w d5,-(a7)          file handle
  47.           move.w #$3F,-(a7)        read RESOUND.INF
  48.           trap #1
  49.           add.l #12,a7
  50.           lea read(PC),a1
  51.           tst.l d0
  52.           bmi problem
  53.  
  54.           move.w d5,-(a7)          close RESOUND.INF
  55.           move.w #$3E,-(a7)
  56.           trap #1
  57.           addq.l #4,a7
  58.  
  59.           lea freq_ind(PC),a1      convert frequency index
  60.           move.b (a1),d0
  61.           sub.b #48,d0
  62.           lsl.b #1,d0
  63.           move.b d0,(a1)
  64.  
  65.           move.w #0,-(a7)          get sample file length
  66.           pea snd_file(PC)
  67.           move.w #$4E,-(a7)
  68.           trap #1
  69.           add.l #8,a7
  70.           lea no_dig(PC),a1
  71.           tst d0
  72.           bne problem
  73.  
  74.           lea dta(PC),a6           save sample file length
  75.           move.l 26(a6),d7
  76.           add.l d7,d6              add file length to program size
  77.  
  78.           lea snd_buf,a0
  79.           lea pointers(PC),a6      save buffer pointer
  80.           move.l a0,(a6)+
  81.           move.l a0,a5
  82.           add.l d7,a0              calculate buffer end pointer
  83.           move.l a0,(a6)           save buffer end pointer
  84.  
  85.           clr.w -(a7)              open sample file
  86.           pea snd_file(PC)
  87.           move.w #$3D,-(a7)
  88.           trap #1
  89.           add.l #8,a7
  90.           lea open(PC),a1
  91.           tst.l d0
  92.           bmi problem
  93.           move.w d0,d5             save file handle
  94.  
  95.           move.l a5,-(a7)          pointer to sample buffer
  96.           move.l d7,-(a7)          size of sample buffer
  97.           move.w d5,-(a7)          file handle
  98.           move.w #$3F,-(a7)        read sample file
  99.           trap #1
  100.           add.l #12,a7
  101.           lea read(PC),a1
  102.           tst.l d0
  103.           bmi problem
  104.  
  105.           move.w d5,-(a7)          close sample file
  106.           move.w #$3E,-(a7)
  107.           trap #1
  108.           addq.l #4,a7
  109.  
  110.           lea start(PC),a0         replace etv_term vector
  111.           move.l a0,$408
  112.  
  113.           pea done(PC)             print message
  114.           move.w #$9,-(a7)
  115.           trap #1
  116.           addq.l #6,a7
  117.  
  118.           move.l d4,-(a7)          return to user mode
  119.           move.w #$20,-(a7)
  120.           trap #1
  121.           addq.l #6,a7
  122.  
  123.           clr.w -(a7)              keep process
  124.           move.l d6,-(a7)
  125.           move.w #$31,-(a7)
  126.           trap #1
  127.  
  128. problem   move.l a1,-(a7)          print error message
  129.           move.w #$9,-(a7)
  130.           trap #1
  131.           addq.l #6,a7
  132.  
  133.           pea abort(PC)
  134.           move.w #$9,-(a7)
  135.           trap #1
  136.           addq.l #6,a7
  137.  
  138.           move.w #1,-(a7)          wait for keypress
  139.           trap #1
  140.           addq.l #2,a7
  141.  
  142.           move.l d4,-(a7)          return to user mode
  143.           move.w #$20,-(a7)
  144.           trap #1
  145.           addq.l #6,a7
  146.  
  147.           clr.w -(a7)              terminate
  148.           trap #1
  149.  
  150. *   GET PARAMETERS/ENTER SUPERVISOR MODE TO ACCESS I/O REGISTERS
  151.  
  152. start     movem.l d0-d7/a0-a6,-(a7) save registers
  153.  
  154.           move.l #$FF8800,a0       set up sound chip registers
  155.  
  156.           move.b #0,(a0)
  157.           move.b #0,2(a0)
  158.  
  159.           move.b #1,(a0)
  160.           move.b #0,2(a0)
  161.  
  162.           move.b #2,(a0)
  163.           move.b #0,2(a0)
  164.  
  165.           move.b #3,(a0)
  166.           move.b #0,2(a0)
  167.  
  168.           move.b #4,(a0)
  169.           move.b #0,2(a0)
  170.  
  171.           move.b #5,(a0)
  172.           move.b #0,2(a0)
  173.  
  174.           move.b #7,(a0)
  175.           move.b #$ff,2(a0)
  176.  
  177.           move.b #8,(a0)
  178.           move.b #0,2(a0)
  179.  
  180.           move.b #9,(a0)
  181.           move.b #0,2(a0)
  182.  
  183.           move.b #10,(a0)
  184.           move.b #0,2(a0)
  185.  
  186.           lea int_vector(PC),a6    get internal interrupt vector
  187.           lea snd_out(PC),a4       get pointer to sound table
  188.  
  189.           lea kbd_off(PC),a0       disable keyboard
  190.           bsr ikbdws
  191.  
  192.           move.w #5,-(a7)          disable timer c interrupt
  193.           move.w #26,-(a7)
  194.           trap #14
  195.           addq.l #4,a7          
  196.  
  197.           lea pointers(PC),a1
  198.           move.l (a1)+,a3          get pointer to sound buffer
  199.           move.l (a1),d6           get end-of-buffer pointer
  200.  
  201.           lea frequency(PC),a0     get timer parameters
  202.           lea freq_ind(PC),a1
  203.           clr.w d0
  204.           move.b (a1),d0
  205.           move.w 0(a0,d0.w),d5
  206.           clr.w d4                 
  207.           move.w d5,d4             extract timer parameters from d5
  208.           andi.w #$FF,d5           get timer control byte
  209.           lsr.w #8,d4              get timer data data
  210.           bsr xbtimer              start mfp timer
  211.  
  212.           bclr.b #3,$FFFA17        set automatic end-of-interrupt mode
  213.           move.w sr,-(a7)          save status register
  214.           move.w #$2400,sr         permit level 6 interrupts only
  215.  
  216. * MAIN PLAYBACK LOOP - TEST FOR END OF SAMPLE BUFFER
  217.  
  218. test_end  cmp.l a3,d6              end of buffer?
  219.           bhi test_end
  220.  
  221. * STOP INTERRUPT GENERATION
  222.  
  223.           move.w #$2700,sr         disable all interrupts
  224.           bset.b #3,$FFFA17        set software end-of-interrupt mode
  225.           clr.w d5                 stop mfp timer
  226.           bsr xbtimer
  227.  
  228.           move.w #5,-(a7)          re-enable timer c interrupt
  229.           move.w #27,-(a7)
  230.           trap #14
  231.           addq.l #4,a7          
  232.  
  233.           lea kbd_on(PC),a0        re-enable keyboard
  234.           bsr ikbdws
  235.  
  236. clear     btst.b #0,$FFFC00        characters in keyboard buffer?
  237.           beq re_status
  238.           move.b $FFFC02,d7        if go, clear buffer
  239.           bra clear
  240.  
  241. re_status move.w (a7)+,sr          retrieve status register
  242.           movem.l (a7)+,d0-d7/a0-a6 restore registers
  243.           rts
  244.  
  245. * TURN KEYBOARD OFF/ON
  246.  
  247. ikbdws    move.l a0,-(a7)          pointer to string
  248.           move.w #0,-(a7)          1 parameter in string
  249.           move.w #25,-(a7)         write string to keyboard processor
  250.           trap #14
  251.           addq.l #8,a7
  252.           rts
  253.  
  254. * START/STOP MFP TIMER A
  255.  
  256. xbtimer   move.l a6,-(a7)          interrupt vector
  257.           move.w d4,-(a7)          timer a data
  258.           move.w d5,-(a7)          timer a control
  259.           move.w #0,-(a7)          timer a select
  260.           move.w #31,-(a7)         start mfp timer
  261.           trap #14
  262.           add.l #12,a7
  263.           rts
  264.  
  265. * INTERRUPT ROUTINE
  266.  
  267. int_vector clr.w d7                clear table lookup index
  268.           move.b (a3)+,d7          get byte from sample buffer
  269.           add.b #$80,d7            convert to signed value
  270.           lsl.w #3,d7              double longword offset
  271.           move.l 0(a4,d7.w),d0     load sound to psg registers
  272.           move.l #$FF8800,a2       sound chip pointer
  273.           dc.w $01CA               movep.l d0,0(a2)/move data to
  274.           dc.w $00                      sound chip volume registers
  275.           move.w 4(a4,d7.w),d0     movep.w d0,0(a2)
  276.           dc.w $018A
  277.           dc.w $00
  278.